跳到主要内容

10 EXTI中断实验

10 EXTI实验

按键控制流水灯实验 光照控制流水灯实验

例程代码: 📥按键控制流水灯实验代码

🔤中断服务函数

HAL 库为了用户使用方便,提供了一个中断通用入口函数 HAL_GPIO_EXTI_IRQHandler

  • 在该函数内部直接调用中断回调函数 HAL_GPIO_EXTI_Callback()

  • 用户只要在中断回调函数中写程序即可

1 🔽按键控制流水灯实验​

1.1 实验连接​

图片

1.2 实验原理​

图片
  • 当按键松开的时候 此时PA0处于一个浮空的状态 我们希望给它一个确定的低电平 所以我们可以将IO口下拉

  • 当我们按下按键的时候 此时PA0就从低电平跳变成高电平 我们通过将PA0复用到EXTI0外部中断线

图片
  • 输入到EXTI外设通过边缘检测电路后生成一个脉冲信号然后通过或门 接着再通过与门

  • 这个遮掩寄存器IMR我们在CubeMX中将GPIO配置为EXTI0的时候就会初始化为1 所以1乘任何数为它本身直接通过

  • 接着将Pending挂起中断请求寄存器置为1 向NVIC发出中断请求 NVIC就会对中断使能和中断优先级进行判定 当NVIC决定打断CPU的时候就会进入中断的四步流程

流水灯中的延时会让CPU不能随时检查按键,通过中断把“按键按下”的通知主动告诉CPU。

HAL 的中断入口调用 HAL_GPIO_EXTI_Callback()。本课代码在回调中把 flag 设为 1,主循环再根据它选择流水灯分支。

1.3 CubeMX配置​

CubeMX配置
CubeMX配置
CubeMX配置
CubeMX配置

1.4 实验代码​

按键去抖
//注意!!!需要把systick的中断优先级调到比EXTI更高 然后在这份代码的hal_Delay后面加一个readPin的判断 这样就可以简单地按键去抖了
//systick的中断优先级默认最低,如果不改的话会卡在延时里面出不来
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == KEY_Pin)
{
HAL_Delay(20);//等待20ms
if (HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == 0)//再进行判定,从而实现按键去抖
{
flag = 1;
}
}
}

全局​

uint8_t flag = 0;
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
flag = 1;
}

main()​

while(1)里面​

if(flag == 1)
{
//流水灯1
}
else
{
//流水灯2
}

2 ☀️光照/温度控制流水灯实验​

2.1 实验连接​

图片

2.2 实验原理​

和按键触发一样 属于外部中断源

2.3 CubeMX配置​

我们直接复用按键控制的配置

2.4 实验代码​

我们直接复用按键控制的代码